package cn.android.support.v7.lib.sin.crown.utils;

import android.app.Activity;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.media.MediaMetadataRetriever;
import android.provider.MediaStore;
import android.util.Log;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import cn.android.support.v7.lib.sin.crown.base.BasePhotoActivity;

/**
 * 获取系统相册，视频等文件
 * Created by 彭治铭 on 2018/3/2.
 */

public class SysPhotoUtils {

    private static SysPhotoUtils sysPhoto;

    public static SysPhotoUtils getInstance() {
        if (sysPhoto == null) {
            sysPhoto = new SysPhotoUtils();
        }
        return sysPhoto;
    }

    //获取本地所有图片，必须需要SD卡权限
    //总数 607张图片	耗时:	83毫秒。一秒都不用[【仅仅获取图片信息，如果转换加载成Bitmap位图，估计就耗时了。】
    //返回图片路径数组。就返回路径，不要转Bitmap位图。图片多了就太耗时了。
    public List<String> getPhotoes(Activity activity) {

//        long start = System.currentTimeMillis();//开始时间,记录耗时。
        List<String> photoes = new ArrayList<>();
        Cursor cursor = activity.getContentResolver().query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                //获取图片的完整路径
                String path = cursor
                        .getString(cursor
                                .getColumnIndexOrThrow(MediaStore.Video.Media.DATA));

//                //获取图片的名称【有后缀】
//                String name = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
                //获取图片的大小【字节大小，单位为B,除以1024可以转成KB】
                long size = cursor
                        .getLong(cursor
                                .getColumnIndexOrThrow(MediaStore.Video.Media.SIZE));
//
//                //获取图片的详细信息【一般都为空(null)】
//                String desc = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DESCRIPTION));
                if (size < 1000000) {
                    photoes.add(path);//过滤掉1M以上的图片。
                }
                //Log.e("test", "name:\t" + name + "\tpath:\t" + path + "\tdesc:\t" + desc + "\tsize:\t" + UtilNumber.getInstance().getDataSize(size));
            }
            cursor.close();
//            Log.e("test", "扫码总数:\t" + photoes.size() + "\t耗时:\t" + (System.currentTimeMillis() - start));
        }
        //list里面的图片，默认是按时间顺序排的，即时间越早(小)的越在前。
        Collections.reverse(photoes);//对list进行反转排序。时间越晚(大)越在前，即最新的图片排序在前。
        return photoes;
    }

    //获取本地所有视频，必须需要SD卡权限
    //视频总数:	100	耗时:	62毫秒【不使用MediaMetadataRetriever，如果使用了，估计要10几秒】
    public void getVideoes(Activity activity) {
        long start = System.currentTimeMillis();//开始时间,记录耗时。
        List<BasePhotoActivity.VideoModel> list = null;
        if (this != null) {
            Cursor cursor = activity.getContentResolver().query(
                    MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null, null,
                    null, null);
            if (cursor != null) {
                list = new ArrayList<BasePhotoActivity.VideoModel>();
                while (cursor.moveToNext()) {
                    int id = cursor.getInt(cursor
                            .getColumnIndexOrThrow(MediaStore.Video.Media._ID));
                    String title = cursor
                            .getString(cursor
                                    .getColumnIndexOrThrow(MediaStore.Video.Media.TITLE));
                    String album = cursor
                            .getString(cursor
                                    .getColumnIndexOrThrow(MediaStore.Video.Media.ALBUM));
                    String artist = cursor
                            .getString(cursor
                                    .getColumnIndexOrThrow(MediaStore.Video.Media.ARTIST));
                    String displayName = cursor
                            .getString(cursor
                                    .getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME));
                    String mimeType = cursor
                            .getString(cursor
                                    .getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE));
                    String path = cursor
                            .getString(cursor
                                    .getColumnIndexOrThrow(MediaStore.Video.Media.DATA));
                    long duration = cursor
                            .getInt(cursor
                                    .getColumnIndexOrThrow(MediaStore.Video.Media.DURATION));
                    long size = cursor
                            .getLong(cursor
                                    .getColumnIndexOrThrow(MediaStore.Video.Media.SIZE));

                    //以上方法执行会很快，但是下面MediaMetadataRetriever执行就慢了。

                    File file = new File(path);
                    if (!file.exists()) {
                        continue;
                    }
                    MediaMetadataRetriever media = new MediaMetadataRetriever();//使用MediaMetadataRetriever会比较耗时
                    try {
                        media.setDataSource(path);//基本上只支持.mp4格式。像rmvb格式基本不支持。
                    } catch (Exception e) {
                        Log.e("test", "不支持:\t" + path);
                        continue;
                    }
                    String time = media.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);// 取得视频的长度(单位为毫秒)
                    int seconds = Integer.valueOf(time) / 1000;//转化为秒。
                    Double size2 = NumberUtils.getInstance().getDataSizeMB(file.length());

                    //获取位图，最耗时
                    //Bitmap bitmap = media.getFrameAtTime(seconds*1000*1000);//返回最后一张。getFrameAtTime()单位是us,微秒。
                    //Bitmap bitmap = media.getFrameAtTime(0);//返回第一张。
                    Bitmap bitmap = media.getFrameAtTime();//返回第一张。默认就是第一张。

                    BasePhotoActivity.VideoModel videoModel = new BasePhotoActivity.VideoModel();
                    videoModel.setFile(file);
                    videoModel.setName(file.getName());
                    videoModel.setPath(file.getAbsolutePath());
                    videoModel.setTime(seconds + "");
                    videoModel.setSize(size2 + "");
//                    videoModel.setFirstBitmap(bitmap);
//                    Log.e("test", "" + videoModel.toString());
                    Log.e("test", "路径:\t" + path);

                    BasePhotoActivity.VideoModel video = new BasePhotoActivity.VideoModel();
                    list.add(video);
                }
                cursor.close();
                Log.e("test", "视频总数:\t" + list.size() + "\t耗时:\t" + (System.currentTimeMillis() - start));
            }
        }
    }

}
